/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Objetos.Dia;
import DAO.AccessDatabase;
import Objetos.Usuario;
import Objetos.ValoresFixos;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author celiobj
 */
public class RepositorioDia implements RepositorioDiaInterface {

    @Override
    public void abrirDia(Dia dia,Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `dias` (`saldoanteriorDia`, `dataDia`, `saldoatualDia`, `situacaoDia`) VALUES ('" + dia.getSaldo_anterior() + "', '" + dia.getDia_mes() + "', '" + dia.getSaldo_atual() + "', '" + dia.getSituacao() + "');");

        } catch (SQLException ex) {
            Logger.getLogger(RepositorioUsuario.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

    @Override
    public void fecharDia(Dia dia,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `dias` SET `situacaoDia`='"+ValoresFixos.SituacaoDia.fechado.getSituacao()+"' WHERE `iddia`='" + dia.getCodDia() + "'");
            con.close();

        } catch (SQLException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public Dia verificarUltimoDia(Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM dias where iddia = (select MAX(iddia) from dias)");
            if (rs.next()) {

                Dia dia = new Dia();
                dia.setCodDia(rs.getString("iddia"));
                dia.setSaldo_anterior(rs.getString("saldoanteriorDia"));
                dia.setDia_mes(rs.getString("dataDia"));
                dia.setSaldo_atual(rs.getString("saldoatualDia"));
                dia.setSituacao(rs.getString("situacaoDia"));
                con.close();
                return dia;
            } else {
                return null;
            }
        } catch (SQLException t) {

            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public String pegarSaldoAnterior(Usuario usu) {

        String retorno;
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT (saldoatualDia) FROM dias where iddia = (select MAX(iddia) from dias)");
            rs.next();

            retorno = rs.getString("saldoatualDia");

            con.close();
            return retorno;

        } catch (SQLException t) {

            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public void alterarSaldo(Dia dia,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `dias` SET `saldoatualDia`='" + dia.getSaldo_atual() + "' WHERE `iddia`='" + dia.getCodDia() + "'");
            con.close();

        } catch (SQLException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public String pegarSaldoDia(String dia, String mes, String ano,Usuario usu) {

        String retorno;
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT (saldoatualDia) FROM dias where dataDia ='"+ano+"-" + mes + "-" + dia + "';");
            rs.next();

            retorno = rs.getString("saldoatualDia");

            con.close();
            return retorno;

        } catch (SQLException t) {

            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public void reabrirDia(Dia dia,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `dias` SET `situacaoDia`='"+ValoresFixos.SituacaoDia.aberto.getSituacao()+"' WHERE `iddia`='" + dia.getCodDia() + "'");
            con.close();

        } catch (SQLException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public JTable consultarTodos(Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT dataDia, situacaoDia, saldoanteriorDia, saldoatualDia FROM `dias`");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("Data");
            cabecalho.addElement("Situação");
            cabecalho.addElement("Saldo Anterior");
            cabecalho.addElement("Saldo");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(200);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(400);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(200);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(200);

            con.close();
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        Vector LinhaAtual = new Vector();

        try {
            for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                switch (rsmd.getColumnType(i)) {
                    case Types.BIGINT:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.VARCHAR:
                        LinhaAtual.addElement(rs.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        LinhaAtual.addElement(rs.getDate(i).toLocaleString().substring(0, 10));
                        break;
                    case Types.INTEGER:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.DECIMAL:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DOUBLE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DATE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraRecuperarData(rs.getDate(i).toString()));
                        break;

                }
            }
        } catch (SQLException e) {
        }
        return LinhaAtual;

    }

}
